package io.github.talelin.latticy.common.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类
 *
 * @author Ljj
 * @date 2021/4/19
 */
public class DateUtils {

    public static final String FORMAT_YMDHMS = "yyyy-MM-dd HH:mm:ss";

    public static final String FORMAT_YMD = "yyyy-MM-dd";

    /**
     * 获取当前日期
     *
     * @return Date
     * @author Ljj
     * @date 2021/4/19
     */
    public static Date getNow() {
        Calendar cal = Calendar.getInstance();
        Date currDate = cal.getTime();
        return currDate;
    }

    /**
     * 日期转换为字符串 格式自定义
     *
     * @param date: 日期
     * @param f:    格式
     * @return java.lang.String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr(Date date, String f) {
        if (date == null) {
            return "";
        }
        SimpleDateFormat format = new SimpleDateFormat(f);
        String str = format.format(date);
        return str;
    }

    /**
     * 日期转换为字符串 MM月dd日 hh:mm
     *
     * @param date: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr(Date date) {
        return dateStr(date, "MM月dd日 hh:mm");
    }

    /**
     * 日期转换为字符串 yyyy-MM-dd
     *
     * @param date: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr2(Date date) {
        return dateStr(date, "yyyy-MM-dd");
    }

    /**
     * yyyy年MM月dd日HH时mm分ss秒
     *
     * @param date: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr5(Date date) {
        return dateStr(date, "yyyy年MM月dd日 HH时mm分ss秒");
    }

    /**
     * 日期转yyyyMMddHHmmss
     *
     * @param date:日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr3(Date date) {
        return dateStr(date, "yyyyMMddHHmmss");
    }

    /**
     * 日期转 yyyy-MM-dd HH:mm:ss
     *
     * @param date: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr4(Date date) {
        return dateStr(date, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 日期转 yyyy年MM月dd日
     *
     * @param date: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr6(Date date) {
        return dateStr(date, "yyyy年MM月dd日");
    }

    /**
     * 日期转 yyyyMMdd
     *
     * @param date: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr7(Date date) {
        return dateStr(date, "yyyyMMdd");
    }

    /**
     * 日期转 MM-dd
     *
     * @param date: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr8(Date date) {
        return dateStr(date, "MM-dd");
    }

    /**
     * 日期转 HH:mm
     *
     * @param date: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr9(Date date) {
        return dateStr(date, "HH:mm");
    }

    /**
     * 日期转 HH
     *
     * @param date: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr10(Date date) {
        return dateStr(date, "HH");
    }

    /**
     * 日期转 mm
     *
     * @param date: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String dateStr11(Date date) {
        return dateStr(date, "mm");
    }

    /**
     * 日期转’yyyy年MM月dd日 HH:mm‘格式
     *
     * @param date: 日期
     * @return String
     */
    public static String dateStr12(Date date) {
        return dateStr(date, "yyyy年MM月dd日 HH:mm");
    }

    /**
     * 将时间戳转换为Date
     *
     * @param times: 时间戳
     * @return Date
     * @author Ljj
     * @date 2021/4/19
     */
    public static Date getDate(String times) {
        long time = Long.parseLong(times);
        return new Date(time * 1000);
    }

    /**
     * 将Date转换为时间戳
     *
     * @param date:
     * @return long
     * @author Ljj
     * @date 2021/4/19
     */
    public static long getTime(Date date) {
        return date.getTime() / 1000;
    }

    /**
     * 获取指定日期星期几
     *
     * @param dt: 日期
     * @return String
     * @author Ljj
     * @date 2021/4/19
     */
    public static String getWeekOfDate(Date dt) {
        String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0) {
            w = 0;
        }
        return weekDays[w];
    }


    /**
     * 获取指定日期星期几(int)
     *
     * @param dt: 日期
     * @return int
     * @author Ljj
     * @date 2021/4/19
     */
    public static int getWeekOfInt(Date dt) {
        int[] weekDays = {7, 1, 2, 3, 4, 5, 6};
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0) {
            w = 0;
        }
        return weekDays[w];
    }


    /**
     * 前/后?分钟
     *
     * @param d:      日期
     * @param minute: 分钟
     * @return java.util.Date
     * @author Ljj
     * @date 2021/4/19
     */
    public static Date rollMinute(Date d, int minute) {
        return new Date(d.getTime() + minute * 60 * 1000);
    }

    /**
     * 前/后?天
     *
     * @param d:   日期
     * @param day: 天
     * @return java.util.Date
     * @author Ljj
     * @date 2021/4/19
     */
    public static Date rollDay(Date d, int day) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        cal.add(Calendar.DAY_OF_MONTH, day);
        return cal.getTime();
    }

    /**
     * 前/后?月
     *
     * @param d:   日期
     * @param mon: 月
     * @return java.util.Date
     * @author Ljj
     * @date 2021/4/19
     */
    public static Date rollMon(Date d, int mon) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        cal.add(Calendar.MONTH, mon);
        return cal.getTime();
    }

    /**
     * 前/后?年
     *
     * @param d:    日期
     * @param year: 年
     * @return java.util.Date
     * @author Ljj
     * @date 2021/4/19
     */
    public static Date rollYear(Date d, int year) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        cal.add(Calendar.YEAR, year);
        return cal.getTime();
    }

    /**
     * 获取当前日期多少年，多少月，多少天的日期
     *
     * @param d:    日期
     * @param year: 年
     * @param mon:  月
     * @param day:  天
     * @return java.util.Date
     * @author Ljj
     * @date 2021/4/19
     */
    public static Date rollDate(Date d, int year, int mon, int day) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        cal.add(Calendar.YEAR, year);
        cal.add(Calendar.MONTH, mon);
        cal.add(Calendar.DAY_OF_MONTH, day);
        return cal.getTime();
    }

    /**
     * 获取当前时间-时间戳
     *
     * @return Long
     * @author Ljj
     * @date 2021/4/19
     */
    public static Long getNowTimeStr() {
        return System.currentTimeMillis() / 1000;
    }

    /**
     * 将字符串转为yyyy-MM-dd的格式时间
     *
     * @param dateStr: 日期str
     * @return java.util.Date
     * @author Ljj
     * @date 2021/4/19
     */
    public static Date getDateByDateStr(String dateStr) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            return sdf.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 将字符串转为自定义格式
     *
     * @param dateStr: 日期str
     * @return java.util.Date
     * @author Ljj
     * @date 2021/4/19
     */
    public static Date getDateStr(String dateStr, String format) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            return sdf.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
